home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DS-CD ROM 2 1993 August
/
DS CD-ROM 2.Ausgabe (August 1993).iso
/
programm
/
ds0257
/
demo.exe
/
MENGEN.DEM
< prev
next >
Wrap
Text File
|
1992-02-16
|
12KB
|
437 lines
; ----------------------------
; MENGEN.DEM - Demoprogramm für die Routinen aus MENGEN.LIB
; (für den A86)
;
; (c) Bernd Schemmer 1990 - 1992
; Letzter Update: 15.02.1992
;
; Übersetzen:
; A86 MENGEN.DEM DEMOS.INC TO MENGEN.COM
;
; Hinweis: Die Environment-Variable 'A86' muß den Dateinamen 'MACROS.MAC'
; enthalten und die .LIB-Dateien müssen über die Datei A86.LIB
; erreichbar sein.
;
; ---------------------------
jmp start ; Daten überspringen
logo db CR,LF
db 'MENGEN.DEM - Demoprogramm für die Routinen aus MENGEN.LIB'
db CR,LF
db '----------------------------------------------------------'
db CR,LF
db CR,LF
GETLENGTH logo
; ----------------------------
; DefiniereMenge (aus MENGEN.INC übernenommes Macro)
;
; Funktion: Definiert die Menge mit dem namen #1 als leere Menge
;
; Aufruf: _DefiniereMenge NameDerMenge
;
_DefiniereMenge MACRO
#1 dw 16xD dup (0)
#EM
; Definition der Mengen
;
_DefiniereMenge Menge1
_DefiniereMenge Menge2
; Elemente, die in Menge1 ein übernommen werden sollen
; (hier die Tasten der 3. Tastaturreihe)
;
MakeMsg1 Elemente_fuer_Menge1,'qwertzuiopü+QWERTZUIOPÜ*'
; Elemente, die in Menge2 ein übernommen werden sollen
; (hier alle Ziffern)
;
MakeMsg1 Elemente_fuer_Menge2,'1','2','3','4','5','6','7','8','9','0'
MakeMsg prompt1,'Bitte drücken Sie eine Taste (ESC = Ende des Tests): '
MakeMsg msg0, '---- Testen, ob ein Element in der Menge1 vorhanden ist'
MakeMsg msg1, '---- Gedrückte Taste ***ist*** in der Menge1 vorhanden',CR,LF
MakeMsg msg2, '---- Gedrückte Taste ***ist nicht*** in der Menge1 vorhanden',CR,LF
MakeMsg msg4, '---- Füge der Menge1 die Elemente "y" und "-" zu'
MakeMsg msg5, '---- Entferne die Elemente "q" und "+" aus der Menge1'
MakeMsg msg6, '---- Lösche die Menge1 ...'
MakeMsg msg7, '---- Kopiere die Menge der Kleinbuchstaben in die Menge1'
MakeMsg msg8, '---- Bilde die Vereinigungsmenge von Menge1 und der Menge der Zahlen'
; ------------------
start:
call ShowLogo ; Logo ausgeben und Speicherblock verkleinern
; Inhalte der vordefinierten Mengen ausgeben
call ShowPreDefMengen
; Menge1 bilden
mov bx,offset Menge1
mov di,offset Elemente_Fuer_Menge1
mov cx,Elemente_fuer_Menge1_LENGTH
call Bilde_Menge
call ShowMenge1
; Menge2 bilden
mov bx,offset Menge2
mov di,offset Elemente_Fuer_Menge2
mov cx,Elemente_fuer_Menge2_LENGTH
call Bilde_Menge
call ShowMenge2
; Beispiel für die Nutzung von Mengen
l0:
call ShowMenge1
WRITE_STRING msg0
WRITE_STRING prompt1
mov ah,08
int 021h ; Zeichen lesen
cmp al,ESC
je >l3 ; Ende
; Testen, ob das Zeichen in der Menge vorhanden ist
mov bx,offset Menge1
call Element_Vorhanden?
jz >l1 ; Zeichen nicht vorhanden
; Zeichen vorhanden
WRITE_STRING msg1
jmp >l2
l1:
WRITE_STRING msg2
l2:
jmp l0
l3:
call ShowMenge1
WRITE_STRING msg4
mov bx,offset menge1
mov al,'y' ; Hinzufügen eines Elementes
call add_Element
mov al,'-'
call add_Element
call ShowMenge1
WRITE_STRING msg5
mov bx,offset menge1
mov al,'q' ; Entfernen eines Elementes
call Sub_Element
mov al,'+'
call Sub_element
call ShowMenge1
WRITE_STRING msg6
mov bx,offset menge1 ; Löschen einer Menge
call Loesche_Menge
call ShowMenge1
WRITE_STRING msg7 ; Kopieren einer Menge
mov di,offset menge1
mov bx,offset Menge_Der_Kleinbuchstaben
call Kopiere_menge
call ShowMenge1
; Bilden der Vereinigungsmenge
WRITE_STRING msg8
mov di,offset menge1
mov bx,offset Menge2
call Vereinige_Mengen
call ShowMenge1
; Beispiel zur Deklaration von Mengen
; als initialisierte Variablen
call GetDefaultForAMenge
; Beispiele für die Mengenoperationen
call ShowMengenOperationen
EndProcess 0
; ----------------------------
; ShowMenge1
;
; Funktion: Gibt alle belegten Mengenelemente der Menge1 als ASCII-Zeichen
; auf die Standard-Ausgabe aus
;
MakeMsg1 msg3, 'Inhalt der Menge1: '
ShowMenge1:
WRITE_STRING msg3
mov bx,offset menge1
call ShowMenge
ret
; ----------------------------
; ShowMenge2
;
; Funktion: Gibt alle belegten Mengenelemente der Menge2 als ASCII-Zeichen
; auf die Standard-Ausgabe aus
;
MakeMsg1 msg30,'Inhalt der Menge2: '
ShowMenge2:
WRITE_STRING msg30
mov bx,offset menge2
call ShowMenge
ret
; ----------------------------
; ShowPreDefMengen
;
; Funktion: Gibt die Inhalt der vordefinierten Mengen als ASCII-Zeichen
; auf die Standard-Ausgabe aus
;
MakeMsg1 msg01, 'Inhalt der Menge der Großbuchstaben: '
MakeMsg1 msg02, 'Inhalt der Menge der Kleinbuchstaben: '
MakeMsg1 msg03, 'Inhalt der Menge der aller Buchstaben: '
ShowPreDefMengen:
WRITE_STRING msg01
mov bx,offset menge_Der_Grossbuchstaben
call ShowMenge
WRITE_STRING msg02
mov bx,offset menge_Der_Kleinbuchstaben
call ShowMenge
WRITE_STRING msg03
mov bx,offset menge_Der_buchstaben
call ShowMenge
ret
; ----------------------------
; GetDefaultForAMenge
;
; Funktion: Demonstriert wie die Voreinstellung für eine Menge
; ermittelt werden kann
;
msg04 db 'Beispiel für die Ermittlung der Belegung einer Menge'
db CR,LF
db CR,LF
db 'Bitte geben Sie die Elemente für die Menge ein: '
db CR,LF
GETLENGTH msg04
MakeMsg msg05, 'Die eingegebene Menge hat folgende Elemente: '
msg06 db 'Soll die Menge mit diesen Elementen schon so im Programm'
db CR,LF
db 'deklariert werden, so muß dies folgendermaßen geschehen: '
db CR,LF
db CR,LF
db ' menge DW '
s0 db '00000h,00000h,00000h,00000h,00000h,00000h,00000h,00000h'
db CR,LF
db ' DW '
s1 db '00000h,00000h,00000h,00000h,00000h,00000h,00000h,00000h'
db CR,LF
db CR,LF
db 'Nochmal?'
GETLENGTH msg06
_DefiniereMenge bspmenge
elementpuffer db 255,256 dup 0 ; Puffer zum Lesen der Elemente
GetDefaultForAMenge:
WRITE_STRING msg04
; Elemente lesen
mov dx,offset elementpuffer
mov ah,0Ah
int 021h
call ShowCR_LF
; Menge erstellen
mov bx,offset bspmenge
mov di,offset elementpuffer+2
mov cl,[di-1] ; CL = Anzahl Elemente für die Menge
call Bilde_Menge
WRITE_STRING msg05
mov bx,offset bspmenge
call ShowMenge
mov cx,8 ; Ausgabe des Aufbaus der Menge
mov di,offset s0+1
mov si,offset bspmenge
l0:
lodsw
call Konvert_AX_To_Hexstring
add di,3
loop l0
mov cx,8
mov di,offset s1+1
l0:
lodsw
call Konvert_AX_To_Hexstring
add di,3
loop l0
WRITE_STRING msg06
mov ah,08h
int 021h
cmp al,'j'
je >l1
cmp al,'J'
je >l1
ret
l1:
call ShowCR_LF
mov bx,offset bspmenge
call Loesche_Menge
jmp GetDefaultForAMenge
; ----------------------------
; ShowMengenOperationen
;
; Funktion: Beispiele für die Mengen-Operationen
;
BspMenge1 dw 16 dup 0 ; Beispielmenge1
BspMenge2 dw 16 dup 0 ; Beispielmenge2
BspMenge3 dw 16 dup 0 ; Hilfsmenge
MakeMsg1 ElementefuerMenge1, '1234567890abcdefg'
MakeMsg1 ElementefuerMenge2, 'ABCDEFGabcdef'
MakeMsg1 BspMenge1Msg, '___ Elemente in der BspMenge1: '
MakeMsg1 BspMenge2Msg, '___ Elemente in der BspMenge2: '
MakeMsg CreateMsg, CR,LF,'---- Erstelle die Mengen BspMenge1 und BspMenge2 ...'
MakeMsg NegMsg, '---- Negiere die Menge BspMenge1 ...'
MakeMsg ORMsg, '---- Bilde die Vereinigungsmenge von BspMenge1 und BspMenge2 ...'
MakeMsg ANDMsg, '---- Bilde die Schnittmenge von BspMenge1 und BspMenge2 ...'
MakeMsg XORMsg, '---- Bilde die XOR-Menge von BspMenge1 und BspMenge2 ...'
ShowMengenOperationen:
Write_String CreateMsg
; Mengen erstellen
mov di,offset ElementeFuerMenge1
mov cl,ElementeFuerMenge1_LENGTH
mov bx,offset BspMenge1
call Bilde_Menge
mov di,offset ElementeFuerMenge2
mov cl,ElementeFuerMenge2_LENGTH
mov bx,offset BspMenge2
call Bilde_Menge
mov bx,offset BspMenge2
mov di,offset BspMenge3
call Kopiere_Menge
call ShowBSPMengen
Write_String NegMsg
mov bx,offset BspMenge1
mov di,offset BspMenge2
call Negiere_Menge
call ShowBSPMengen
Write_String ORMsg
mov bx,offset BspMenge1
mov di,offset BspMenge2
call Vereinige_Mengen
call ShowBSPMengen
Write_String ANDMsg
mov bx,offset BspMenge1
mov di,offset BspMenge2
call Schneide_Mengen
call ShowBSPMengen
Write_String XORMsg
mov bx,offset BspMenge1
mov di,offset BspMenge2
call XOR_Mengen
call ShowBSPMengen1
ret
; ----------------------------
; ShowBSPMengen
;
; Funktion: Ausgabe der Beispielmengen und Restaurierung
; der Menge BspMenge2
;
ShowBSPMengen:
mov di,offset BspMenge1Msg
mov bx,offset BspMenge1
call Card_Menge
call Konvert_AL_TO_Dezstring
Write_String BspMenge1Msg
call ShowMenge
mov di,offset BspMenge2Msg
mov bx,offset BspMenge2
call Card_Menge
call Konvert_AL_TO_Dezstring
Write_String BspMenge2Msg
call ShowMenge
mov bx,offset BspMenge3
mov di,offset BspMenge2
call Kopiere_Menge
call ShowPause
jnc >l1
add sp,2 ; Ret-Adresse vom Stack
ret ; und raus
l1:
ShowBSPMengen1:
mov di,offset BspMenge1Msg
mov bx,offset BspMenge1
call Card_Menge
call Konvert_AL_TO_Dezstring
Write_String BspMenge1Msg
call ShowMenge
mov di,offset BspMenge2Msg
mov bx,offset BspMenge2
call Card_Menge
call Konvert_AL_TO_Dezstring
Write_String BspMenge2Msg
call ShowMenge
ret
; ----------------------------
; ShowMenge
;
; Funktion: Gibt alle belegten Mengenelemente der bei Menge DS:BX
; als ASCII-Zeichen auf die Standard-Ausgabe aus
;
ShowMenge:
xor al,al
mov cx,256
l0:
push cx
push ax
call Element_Vorhanden?
jz >l1
pop dx
push dx
; Element ist vorhanden
mov ah,02h
int 021h ; Zeichen ausgeben
l1:
pop ax
pop cx
inc al
loop l0
call ShowCR_LF
ret